强化学习极简入门:通俗理解MDP、DP MC TC和Q学习、策略梯度、PPO |
您所在的位置:网站首页 › 强化学习 pomdp › 强化学习极简入门:通俗理解MDP、DP MC TC和Q学习、策略梯度、PPO |
前言
22年底/23年初ChatGPT大火,在写《ChatGPT技术原理解析》的过程中,发现ChatGPT背后技术涉及到了RL/RLHF,于是又深入研究RL,研究RL的过程中又发现里面的数学公式相比ML/DL更多,于此激发我一边深入RL,一边重修微积分、概率统计、最优化,前者成就了本篇RL极简入门,后者成就了另两篇数学笔记:概率统计极简入门(23修订版)、一文通透优化算法(23修订版) 如上篇ChatGPT笔记所说,本文最早是作为ChatGPT笔记的第一部分的,但RL细节众多,如果想完全在上篇笔记里全部介绍清楚,最后篇幅将长之又长同时还影响完读率,为了避免因为篇幅限制而导致RL很多细节阐述的不够细致,故把RL相关的部分从上文中抽取出来独立成本文 一方面,原有内容(第一部分 RL基础:什么是RL与MRP、MDP,和第四部分 策略学习:从策略梯度到TRPO、PPO算法)继续完善、改进,完善记录见本文文末二方面,在原有内容上新增了以下这两部分内容的详细阐述: 第二部分 RL进阶之三大表格求解法:DP、MC、TD 第三部分 价值学习:从n步Sarsa算法到Q-learning、DQN另,本文有两个特色 定位入门。过去一个多月,我翻遍了十来本RL中文书,以及网上各种RL资料有的真心不错(比如sutton的RL书,但此前从来没有接触过RL的不建议一上来就看该书,除非你看过本文之后) 其余大部分要么就是堆砌概念/公式,要么对已经入门的不错,但对还没入门的初学者极度不友好,比如总之,大部分写书、写教材、写文章的人过了那个从不懂到懂的过程,所以懂的人写给不懂的人看,处处都是用已懂的思维去写,而不是用怎么从不懂到懂的思维 去写,未来三年 奋笔疾书,不断给更多初学者普及AI和RL技术 第一部分 RL基础:什么是RL与MRP、MDP 1.1 入门强化学习所需掌握的基本概念 1.1.1 什么是强化学习:依据策略执行动作-感知状态-得到奖励强化学习里面的概念、公式,相比ML/DL特别多,初学者刚学RL时,很容易被接连不断的概念、公式给绕晕,而且经常忘记概念与公式符号表达的一一对应。 为此,我建议学习RL的第一步就是一定要扎实关于RL的一些最基本的概念、公式(不要在扎实基础的阶段图快或图囵吞枣,不然后面得花更多的时间、更大的代价去弥补),且把概念与公式的一一对应关系牢记于心,这很重要。当然,为最大限度的提高本文的可读性,我会尽可能的多举例、多配图。 另,RL里面存着大量的数学,考虑到可以为通俗而增加篇幅,但不为了介绍而介绍式的增加篇幅,故 像高数/概率统计里的什么叫导数,期望以及什么叫概率分布、熵/香浓熵(Shannon熵)/交叉熵、相对熵(也称KL散度,即KL divergence)、多元函数、偏导数,可以参见Wikipedia或《概率统计极简入门:通俗理解微积分/期望方差/正态分布前世今生(23修订版)》等类似笔记而AI一些最基本的概念比如损失函数、梯度、梯度下降、随机梯度下降(SGD)、学习率等,可以参考此篇笔记:《一文通透优化算法:从梯度下降、SGD到牛顿法、共轭梯度(23修订版)》,本文则不过多介绍话休絮烦,下面进入正题,且先直接给出强化学习的定义和其流程,然后再逐一拆解、说明。 所谓强化学习(Reinforcement Learning,简称RL),是指基于智能体在复杂、不确定的环境中最大化它能获得的奖励,从而达到自主决策的目的。 经典的强化学习模型可以总结为下图的形式(你可以理解为任何强化学习都包含这几个基本部分:智能体、行为、环境、状态、奖励): 一般的文章在介绍这些概念时很容易一带而过,这里我把每个概念都逐一解释下 Agent,一般译为智能体,就是我们要训练的模型,类似玩超级玛丽的时候操纵马里奥做出相应的动作,而这个马里奥就是Agentaction(简记为总的而言,Agent依据策略决策从而执行动作action,然后通过感知环境Environment从而获取环境的状态state,进而,最后得到奖励reward(以便下次再到相同状态时能采取更优的动作),然后再继续按此流程“依据策略执行动作-感知状态--得到奖励”循环进行。 1.1.2 RL与监督学习的区别和RL方法的分类此外,RL和监督学习(supervised learning)的区别: 监督学习有标签告诉算法什么样的输入对应着什么样的输出(譬如分类、回归等问题) 所以对于监督学习,目标是找到一个最优的模型函数,使其在训练数据集上最小化一个给定的损失函数,相当于最小化预测误差 最优模型 = arg minE { [损失函数(标签,模型(特征)] } RL没有标签告诉它在某种情况下应该做出什么样的行为,只有一个做出一系列行为后最终反馈回来的reward,然后判断当前选择的行为是好是坏 相当于RL的目标是最大化智能体策略在和动态环境交互过程中的价值,而策略的价值可以等价转换成奖励函数的期望,即最大化累计下来的奖励期望 最优策略 = arg maxE { [奖励函数(状态,动作)] } 监督学习如果做了比较坏的选择则会立刻反馈给算法 RL的结果反馈有延时,有时候可能需要走了很多步以后才知道之前某步的选择是好还是坏监督学习中输入是独立分布的,即各项数据之间没有关联 RL面对的输入总是在变化,每当算法做出一个行为,它就影响了下一次决策的输入进一步,RL为得到最优策略从而获取最大化奖励,有 基于值函数的方法,通过求解一个状态或者状态下某个动作的估值为手段,从而寻找最佳的价值函数,找到价值函数后,再提取最佳策略 比如Q-learning、DQN等,适合离散的环境下,比如围棋和某些游戏领域基于策略的方法,一般先进行策略评估,即对当前已经搜索到的策略函数进行估值,得到估值后,进行策略改进,不断重复这两步直至策略收敛 比如策略梯度法(policy gradient,简称PG),适合连续动作的场景,比如机器人控制领域 以及Actor-Criti(一般被翻译为演员-评论家算法),Actor学习参数化的策略即策略函数,Criti学习值函数用来评估状态-动作对,不过,Actor-Criti本质上是属于基于策略的算法,毕竟算法的目标是优化一个带参数的策略,只是会额外学习价值函数,从而帮助策略函数更好的学习 此外,还有对策略梯度算法的改进,比如TRPO算法、PPO算法,当然PPO算法也可称之为是一种Actor-Critic架构,下文会重点阐述可能你还有点懵懵懂懂,没关系,毕竟还有不少背景知识还没有交待,比如RL其实是一个马尔可夫决策过程(Markov decision process,MDP),而为说清楚MDP,得先从随机过程、马尔可夫过程(Markov process,简称MP)开始讲起,故为考虑逻辑清晰,我们还是把整个继承/脉络梳理下。 1.2 什么是马尔科夫决策过程 1.2.1 MDP的前置知识:随机过程、马尔可夫过程、马尔可夫奖励如HMM学习最佳范例中所说,有一类现象是确定性的现象,比如红绿灯系统,红灯之后一定是红黄、接着绿灯、黄灯,最后又红灯,每一个状态之间的变化是确定的 但还有一类现象则不是确定的,比如今天是晴天,谁也没法百分百确定明天一定是晴天还是雨天、阴天(即便有天气预报) 对于这种假设具有 下面的状态转移矩阵显示的是天气例子中可能的状态转移概率: 也就是说,如果昨天是晴天,那么今天是晴天的概率为0.5,是多云的概率为0.375、是雨天的概率为0.125,且这三种天气状态的概率之和必为1。 接下来,我们来抽象建模下。正如概率论的研究对象是静态的随机现象,而随机过程的研究对象是随时间演变的随机现象(比如天气随时间的变化): 随机现象在某时刻t的取值是一个向量随机变量,用在马尔可夫过程的基础上加入奖励函数 而一个状态的期望回报就称之为这个状态的价值,所有状态的价值则组成了所谓的价值函数,用公式表达为 在上式最后一个等式中 前半部分表示当前状态得到的即时奖励从而,综合前后两个部分可得 而这就是所谓的贝尔曼方程(bellman equation)。该公式精准而简洁,其背后浓缩了很多信息,为形象起见,举个例子 比如状态 其中折扣因此为 类似的,因状态 为更加形象起见,再举一个生活中最常见的“吃饭-抽烟/剔牙”例子 比如你吃完饭后你自己的心情愉悦值即奖励+5,然后下一个状态,有 0.6的概率是抽烟(抽烟带来的心情愉悦值即奖励+7,要不说 饭后一支烟 赛过活神仙呢)0.4的概率是剔牙(剔牙带来的奖励值+3)假设折扣因子 从而有: 当从 由于状态 再根据贝尔曼方程 当然,你也可以如此计算(可以很明显的看出,计算量不如上述过程简洁,所以一般优先按上述方式计算) 上述例子的状态比较少所以计算量不大,但当状态一多,则贝尔曼方程的计算量还是比较大的,而求解较大规模的马尔可夫奖励过程中的价值函数时,可以用的方法包括:动态规划、蒙特卡洛方法、时序差分(temporal difference,简称TD)方法 当然,其中细节还是不少的,下文第二部分会详述这三大方法 1.2.2 马尔可夫决策过程(MDP):马尔可夫奖励(MRP) + 智能体动作因素根据上文我们已经得知,在随机过程的基础上 增加马尔可夫性质,即可得马尔可夫过程而再增加奖励,则得到了马尔可夫奖励过程(MRP)如果我们再次增加一个来自外界的刺激比如智能体的动作,就得到了马尔可夫决策过程(MDP) 通俗讲,MRP与MDP的区别就类似随波逐流与水手划船的区别在马尔可夫决策过程中, 换言之,当给定当前状态 假定在当前状态和当前动作确定后,其对应的奖励则设为 从而可得奖励函数即为 考虑到后来有读者对上面这个公式有疑惑,所以解释下推导步骤 首先,计算在状态s下采取动作a后,转移到下一个状态整个过程相当于将不同状态转移概率与对应的奖励 当然,如果奖励是确定性的,则可以简化公式,去掉对 相当于此时只需要计算在状态s下采取动作a后,转移到下一个状态 至于过程中采取什么样的动作就涉及到策略policy,策略函数可以表述为 通过上文,我们已经知道不同状态出现的概率不一样(比如今天是晴天,那明天是晴天,还是雨天、阴天不一定),同一状态下执行不同动作的概率也不一样(比如即便在天气预报预测明天大概率是天晴的情况下,你大概率不会带伞,但依然不排除你可能会防止突然下雨而带伞) 而有了动作这个因素之后,我们重新梳理下价值函数 首先,通过“状态价值函数”对当前状态进行评估当有了策略、价值函数和模型3个组成部分后,就形成了一个马尔可夫决策过程(Markov decision process)。如下图所示,这个决策过程可视化了状态之间的转移以及采取的动作。 且通过状态转移概率分布,我们可以揭示状态价值函数和动作价值函数之间的联系了 在使用策略我猜可能有读者会问怎么来的,简略推导如下 而使用策略 针对这个公式 大部分资料都会一带而过,但不排除会有不少读者问怎么来的,考虑到对于数学公式咱们不能想当然靠直觉的自认为,所以还是得一五一十的推导下 上述推导过程总共五个等式,其中,第三个等式到第四个等式依据的是 接下来,把上面 上述过程可用下图形象化表示(配图来自文献21) 上文简单介绍过动态规划,其核心思想在于复杂问题的最优解划分为多个小问题的最优解的求解问题,就像递归一样,且子问题的最优解会被储存起来重复利用 举个例子,输入两个整数n和sum,从数列1,2,3.......n 中随意取几个数,使其和等于sum,要求将其中所有的可能组合列出来。 注意到取n,和不取n个区别即可,考虑是否取第n个数的策略,可以转化为一个只和前n-1个数相关的问题。 如果取第n个数,那么问题就转化为“取前n-1个数使得它们的和为sum-n”,对应的代码语句就是sumOfkNumber(sum - n, n - 1);如果不取第n个数,那么问题就转化为“取前n-1个数使得他们的和为sum”,对应的代码语句为sumOfkNumber(sum, n - 1)所以其关键代码就是 list1.push_front(n); //典型的01背包问题 SumOfkNumber(sum - n, n - 1); //“放”n,前n-1个数“填满”sum-n list1.pop_front(); SumOfkNumber(sum, n - 1); //不“放”n,前n-1个数“填满”sum其实,这是一个典型的0-1背包问题,其具体描述为:有 简单分析下:这是最基础的背包问题,特点是每种物品仅有一件,可以选择放或不放。用子问题定义状态:即 对于“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只和前 则其状态转移方程便是: 通过上述这两个个例子,相信你已经看出一些端倪,具体而言,动态规划一般也只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。 动态规划算法一般分为以下4个步骤: 描述最优解的结构递归定义最优解的值按自底向上的方式计算最优解的值 //此3步构成动态规划解的基础。由计算出的结果构造一个最优解 //此步如果只要求计算最优解的值时,可省略换言之,动态规划方法的最优化问题的俩个要素:最优子结构性质,和子问题重叠性质 最优子结构 如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。意思就是,总问题包含很多个子问题,而这些子问题的解也是最优的。重叠子问题 子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率更多请参看此文(上面阐述什么是DP的内容就来自此文):通俗理解动态规划:由浅入深DP并解决LCS问题(23年修订版) 2.1.2 通过动态规划法求解最优策略如果你之前没接触过RL,你确实可能会认为DP只存在于数据结构与算法里,实际上 最早在1961年,有人首次提出了DP与RL之间的关系1977年,又有人提出了启发式动态规划,强调连续状态问题的梯度下降法再到1989年,Watkins明确的将RL与DP联系起来,并将这一类强化学习方法表征为增量动态规划下面,我们考虑如何求解最优策略 综合上述两点,可得 另,考虑到 故也可以如sutton的RL一书上,这样写满足贝尔曼最优方程的价值函数 相当于当知道奖励函数和状态转换函数时,便可以根据下一个状态的价值来更新当前状态的价值,意味着可以把计算下一个可能状态的价值当成一个子问题,而把计算当前状态的价值看做当前问题,这不刚好就可以用DP来求解了 于是,sutton的RL一书上给出了DP求解最优策略的算法流程 1.初始化 对蒙特卡洛(monte carlo,简称MC)方法,也称为统计模拟方法,就是通过大量的随机样本来估算或近似真实值,比如近似估算圆的面经、近似定积分、近似期望、近似随机梯度 比如先看估算圆的面积,如下图 可以通过这个式子来近似计算:圆的面积/ 正方形的面积 = 圆中点的个数/正方形中点的个数 类似的,我们也可以用蒙特卡洛方法来估计一个策略在一个马尔可夫决策过程中的状态价值。考虑到 一个状态的价值是它的期望回报,那么如果我们用策略在MDP上采样很多条序列,然后计算从这个状态出发的回报再求其期望是否就可以了?好像可行!公式如下: 再看下如何估算定积分的值『如果忘了定积分长啥样的,可以通过RL所需数学基础的其中一篇笔记《概率统计极简入门:通俗理解微积分/期望方差/正态分布前世今生(23修订版)》回顾下,比如积分可以理解为由无数个无穷小的面积组成的面积S』 如上图,我们可以通过随机取4个点,然后类似求矩形面积那样(底x高),从而用4个面积 接下来 假设令则有 跟蒙特卡洛方法关联的还有一个重要性采样,下文很快会讲到 2.3 时序差分法及与DP、MC的区别当面对状态价值函数的求解时 上述公式总共三个等式 动态规划(DP)会把上述第三个等式的估计值作为目标,不是因为DP要求需要环境模型本身提供期望值,而是因为真实的且DP求解状态 但MC求解状态 有学员在我讲的ChatGPT原理课上对上述这行公式表达了疑问,故再详细解释下 在状态价值函数的估计中,我们实际上并不知道真正的期望回报,因此我们通过多次试验和观察,以样本回报来近似这个期望回报 即 即反馈来的太晚了 不够及时(RL中 经常会遇到奖励延后性的问题) 总之,我们在评估某个状态的回报时,不得不用一种预期回报来表达,即对回报的估计V(St) 但V(St)终究是估计的,既然是估计的就一定有误差,怎么纠偏呢,当然是通过随着时间的推移,得到的真实回报Gt来纠偏了 所以V(St) ← V(St) + α[Gt − V(St)] 的含义是新的估计等于 原来的估计,加上实际回报和估计回报之间的差距(误差)乘以一个学习率 换言之,用V(St)+α[Gt−V(St)] 更新原来的价值估计V(St),α代表的学习率 如果学习率为1,则新价值估计V(St) = G(t),原来的价值估计直接废弃 如果学习率为0,则不进行任何更新,原来的价值估计不变 最终目的是让预测的回报越来越接近真实的回报,从而更好的选择更优策略、更优动作 类比现实生活中,当我们的预测越来越准确时,之后就不用再老用真实回报去更新预测值了,而是直接相信预测的 而时序差分(TD)呢,它既要采样得到上述第一个等式的期望值,而且还要通过使用上述第三个等式中当前的估计值总之,TD结合了DP和MC,与DP一致的点时与MC不一致,与DP不一致的点时恰又与MC一致,某种意义上来说,结合了前两大方法各自的优点,从而使得在实际使用中更灵活,具体而言如下图所示 顺带再举一个例子,好比行军打仗时,为了得到更好的行军路线,将军派一人前去探路 MC的做法相当于一条道走到黑 没走个10公里不回头DP相当于所有道比如10条道 每条道都走个1公里 不错过任何一条可能成为最好道的可能,最后10条道都走完1公里后才返回汇报/反馈TD则相当于先选一条道走个1公里即返回汇报/反馈,之后再走下一条道的1公里为承上启下更为总结,再说一个问题,即七月ChatGPT课群里有学问提问:校长 在A2C算法中,这个优势函数中的计算A(s,a) =Q(s,a) - V(s) 其中这个Q(s,a)和V(s)是由神经网络模拟出来的吗 关于什么是优势函数 下文会具体阐述,咱们就用上文的知识来一步步推导 因从而求解Q时,算是实际奖励R + V,而V通过critic网络学习(比如通过蒙特卡洛或时序差分) 从而A(s, a) = Q(s,a) - V(s)便能比较好的求解了 相当于如春天所说,实践中只需要V(s)用神经网络来实现就行,因为Q(s,a)已经可以被V(s)和R表示了,不需要再另外实现 2.4 RL的分类:基于模型(Value-base/Policy-based)与不基于模型根据问题求解思路、方法的不同,我们可以将强化学习分为 既然上文可以用时序差分来估计状态价值函数,那是否可以用类似策略迭代的方法来评估动作价值函数呢?毕竟在无模型的RL问题中,动作价值函数比状态价值函数更容易被评估 如果用类似TD(0)控制的思路寻找最优的动作价值函数并提取出最优策略,便被称作Sarsa(0)算法,所以,Sarsa所做出的改变很简单,它将原本时序差分方法更新 此外,上文说过,“TD每过一个time step就利用奖励 首先,我们先回复下回报公式的定义,即为(根据前几项可以看出: 从而有 单步回报:类似的,当用n步时序差分的思路去更新 如此,便可以得到如下 Q-learning介绍得闲阐明一个问题,即所谓的同策略学习与异策略学习 首先,先来明确两个概念: 行动遵循的行动策略与被评估的目标策略是同一个策略(如果要学习的智能体和与环境交互的智能体是相同的),则称之为同策略,比如上文介绍的Sarsa行动遵循的行动策略和被评估的目标策略是不同的策略(或如果要学习的智能体和与环境交互的智能体不是相同的),则称之为异策略,比如即将介绍的Q-learning而异策略就是基于重要性采样的原理实现的(但反过来,不是说只要采用了重要性采用,就一定是异策略,比如下文将讲的PPO算法),即通过使用另外一种分布,来逼近所求分布的一种方法 但具体怎么操作呢?为说明怎么变换的问题,再举一个例子。 假设有一个函数 如果分布 当不能在分布 所以就算我们不能从 和Sarsa(0)算法的更新规则 啥意思呢,一步步来看 Q学习有两种策略:目标策略和行为策略 目标策略是我们需要学习的策略,一般用再次总结一下其与Sarsa的区别 在Sarsa算法中,新动作用于更新动作价值函数,并且用于下一时刻的执行工作,这意味着行动策略与目标策略属于同一个策略但在Q-learning算法中,使用确定性策略选出的新动作只用于动作价值函数,而不会被真正执行,当动作价值函数更新后,得到新状态,并基于新状态由// 待更 第四部分 策略学习:从策略梯度、Actor-Criti到TRPO、PPO算法 4.1 策略梯度与其突出问题:采样效率低下本节推导的核心内容参考自Easy RL教程等资料(但修正了原教程上部分不太准确的描述,且为让初学者更好懂,补充了大量的解释说明和心得理解,倪老师则帮拆解了部分公式)。 另,都说多一个公式则少一个读者,本文要打破这点,虽然本节推导很多,但每一步推导都有介绍到,不会省略任何一步推导,故不用担心看不懂(对本文任何内容有任何问题,都欢迎随时留言评论)。 4.1.1 什么是策略梯度和梯度计算/更新的流程策略梯度的核心算法思想是: 参数为比如REINFORCE算法便是常见的策略梯度算法,类似下图所示(下图以及本节大部分配图/公式均来自easy RL教程) 接下来,详细阐述。首先,我们已经知道了策略函数可以如此表示: 其中, 如何评价策略的好坏呢? 假设机器人在策略 可能有读者注意到了,既然奖励是延后的, 给定智能体或演员的策略参数 其中,有的资料也会把 如何评价策略呢?这个策略评价函数为方便理解也可以称之为策略价值函数,就像上文的状态价值函数、动作价值函数,说白了,评估策略(包括状态、动作)的价值,就是看其因此得到的期望奖励 故考虑到期望的定义,由于每一个轨迹 上述整个过程如下图所示 通过上文已经知道,想让奖励越大越好,可以使用梯度上升来最大化期望奖励。而要进行梯度上升,先要计算期望奖励 考虑对 其中,只有 从而进一步转化,可得 Em,怎么来的?别急,具体推导是 上述推导 总共4个等式3个步骤,其中,第一步 先分母分子都乘以一个 此外,本文一读者在23年2.24日的留言说,还想了解 首先,对函数 对上式求导数得: 将等式两边同乘以 这个等式表明,我们可以用 然不巧的是,期望值 任何必要的中间推导步骤咱不能省,大部分文章基本都是一笔带过,但本文为照顾初学者甚至更初级的初学者, 完美!这就是所谓的策略梯度定理,我们可以直观地理解该公式 有一点值得说明的是...,为了提高可读性,还是举个例子来说明吧。 比如到80/90后上大学时喜欢玩的另一个游戏CF(即cross fire,10多年前我在东华理工的时候也经常玩这个,另一个是DNF),虽然玩的是同一个主题比如沙漠战场,但你每场的发挥是不一样的,即便玩到同一个地方(比如A区埋雷的地方),你也可能会控制角色用不同的策略做出不同的动作,比如 在第一场游戏里面,我们在状态这时就可以把采样到的数据用梯度计算公式把梯度算出来 也就是把每一个然而策略梯度有个问题,在于 换言之,策略梯度是一个会花很多时间来采样数据的算法,其大多数时间都在采样数据。智能体与环境交互以后,接下来就要更新参数,我们只能更新参数一次,然后就要重新采样数据, 才能再次更新参数。 这显然是非常花时间的,怎么解决这个问题呢?为避免采样到的数据只能使用一次的问题,还记得上文介绍过的重要性采样否,使得 可以用另外一个策略故基于重要性采样的原则,我们可以用另外一个策略 最终加上重要性权重之后,可得 怎么来的?完整推导如下 梯度的计算好像差不多了?但实际在做策略梯度的时候,并不是给整个轨迹 对于第一个问题,举个例子,比如在某一一个状态,可以执行的动作有a、b、c,但我们可能只采样到动作b或者只采样到动作c,没有采样到动作a 但不管采样情况如何,现在所有动作的奖励都是正的,所以采取a、b、 c的概率都应该要提高可实际最终b、c的概率按预期提高了,但因为a没有被采样到,所以a的概率反而下降了然而问题是a不一定是一个不好的动作,它只是没有被采样到为了解决奖励总是正的的问题,也为避免方差过大,需要在之前梯度计算的公式基础上加一个基准线 上面说 而这个 进一步,由于 基础上, 接下来,我们可以拆解 于是可得公式 这里需要做一件事情,假设模型是 为什么可以这样假设呢?一种直观的解释就是 但是 所以,实际上在更新参数的时候,我们就是按照下式来更新参数: 从而最终可以从梯度 终于大功告成! 4.3 基于信任区域的TRPO:加进KL散度解决两个分布相差大或步长难以确定的问题好巧不巧,看似大功告成了,但重要性采样还是有个问题。具体什么问题呢,为更好的说明这个问题,我们回到上文的那个例子中。 还是那两个分布: 比如,虽然上述公式成立,但如果不是计算期望值,而是 计算方差时因为两个随机变量的平均值相同,并不代表它们的方差相同 此话怎讲?以下是推导过程: 将 则分别可得(且考虑到不排除会有比初级更初级的初学者学习本文,故把第二个公式拆解的相对较细) 上述两个公式前后对比,可以很明显的看出 后者的第一项多乘了所以结论就是,如果我们只要对分布 这意味着什么呢,意味着我们目前得到的这个公式里 如果 2015年John Schulman等人提出了信任区域策略优化(Trust Region Policy Opimization,简称TRPO),表面上,TRPO的出现同时解决了两个问题,一个是解决重要性采样中两个分布差距太大的问题,一个是解决策略梯度算法中步长难以确定的问题 关于前者,在1.2.2节得到的目标函数基础上(下图第一个公式),增加了一个KL散度约束(如下图第二个公式)KL散度(KL divergence),也称相对熵,而相对熵 = 交叉熵 - shannon熵,其衡量的是两个数据分布 下图左半边是一组原始输入的概率分布曲线 顺带从零推导下KL散度的公式 1 所谓概率:对于 2 所谓信息:对 3 所谓Shannon熵(熵是信息的平均,直观上,Shannon熵是信息在同一分布下的平均): 4 所谓交叉熵Cross-Entropy(直观上,交叉熵是信息在不同分布下的平均),即指 5 所谓相对熵或KL散度 = 交叉熵 - shannon熵,即 所以如果在KL散度表达式的最前面加个负号,再结合Jensen不等式自然有 这是1.2.1节,我们已经得到的策略梯度计算、策略梯度更新公式如下(别忘了,学习率 对这个问题,我们考虑在更新时找到一块信任区域(trust region),在这个区域上更新策略时能够得到安全性保证,这就是TRPO算法的主要思想 本质上,其实这两个问题是同一个问题(简言之,避免两个分布相差大即意味着避免步长过大)。举个例子,比如爬两面都是悬崖的山,左右脚交替往前迈步,无论哪只脚向前迈步都是一次探索 为尽快到达山顶且不掉下悬崖,一方面 你会选择最陡峭的方向,二方面 你会用目光选择一片信任区域,从而尽量远离悬崖边,在信任区域中,首先确定要探索的最大步长(下图的黄色圆圈),然后找到最佳点并从那里继续搜索好,现在问题的关键变成了,怎么确定每一步的步长呢?如果每一步的步长太小,则需要很长时间才能到达峰值,但如果步长太大,就会掉下悬崖(像不像两个分布之间差距不能太大)具体做法是,从初始猜测开始可选地,然后动态地调整区域大小。例如,如果新策略和当前策略的差异越来越大,可以缩小信赖区域。怎么实现?KL散度约束!总之,TRPO就是考虑到连续动作空间无法每一个动作都搜索一遍,因此大部分情况下只能靠猜。如果要猜,就最好在信任域内部去猜。而TRPO将每一次对策略的更新都限制了信任域内,从而极大地增强了训练的稳定性。 至此,PG算法的采样效率低下、步长难以确定的问题都被我们通过TRPO给解决了。但TRPO的问题在哪呢? TRPO的问题在于把 KL 散度约束当作一个额外的约束,没有放在目标里面,导致TRPO很难计算,总之因为信任域的计算量太大了,John Schulman等人于2017年又推出了TRPO的改进算法:PPO 4.4 近端策略优化PPO:解决TRPO的计算量大的问题 4.4.1 什么是近端策略优化PPO与PPO-penalty如上所述,PPO算法是针对TRPO计算量的大的问题提出来的,正因为PPO基于TRPO的基础上改进,故PPO也解决了策略梯度不好确定学习率Learning rate (或步长Step size) 的问题。毕竟通过上文,我们已经得知 如果 step size 过大, 学出来的 Policy 会一直乱动,不会收敛;但如果 Step Size 太小,想完成训练,我们会等到地老天荒而PPO 利用 New Policy 和 Old Policy 的比例,限制了 New Policy 的更新幅度,让策略梯度对稍微大点的 Step size 不那么敏感具体做法是,PPO算法有两个主要的变种:近端策略优化惩罚(PPO-penalty)和近端策略优化裁剪(PPO-clip),其中PPO-penalty和TRPO一样也用上了KL散度约束。 近端策略优化惩罚PPO-penalty的流程如下 首先,明确目标函数,通过上节的内容,可知咱们需要优化 接下来,先初始化一个策略的参数 当然,也可以把上述那两个公式合二为一『如此可以更直观的看出,PPO-penalty把KL散度约束作为惩罚项放在了目标函数中(可用梯度上升的方法去最大化它),此举相对TRPO减少了计算量』 上述流程有一个细节并没有讲到,即 关于 总之,近端策略优化惩罚可表示为 如果觉得计算 KL散度很复杂,则还有一个 PPO2算法,即近端策略优化裁剪PPO-clip。近端策略优化裁剪的目标函数里面没有 KL 散度,其要最大化的目标函数为(easy RL上用 整个目标函数在 换言之,这个裁剪算法和KL散度约束所要做的事情本质上是一样的,都是为了让两个分布之间的差距不致过大,但裁剪算法相对好实现,别看看起来复杂,其实代码很好写 // ratios即为重要性权重,exp代表求期望,括号里的environment_log_probs代表用于与环境交互的策略 ratios = torch.exp(log_probs - environment_log_probs) // 分别用sur_1、sur_2来计算公式的两部分 // 第一部分是重要性权重乘以优势函数 sur_1 = ratios * advs // 第二部分是具体的裁剪过程 sur_2 = torch.clamp(ratios, 1 - clip_eps, 1 + clip_eps) * advs // 最终看谁更小则取谁 clip_loss = -torch.min(sur_1,sur_2).mean()回到公式,公式的第一部分我们已经见过了,好理解,咱们来重点分析公式的第二部分 最后把公式的两个部分综合起来,针对整个目标函数 反之,如果 综上,PPO算法是一种具体的Actor-Critic算法实现,比如在对话机器人中,输入的prompt是state,输出的response是action,想要得到的策略就是怎么从prompt生成action能够得到最大的reward,也就是拟合人类的偏好。具体实现时,可以按如下两大步骤实现 首先是Make Experience 部分,利用 SFT 、Actor、RM、Critic模型计算生成 Experience(包括sequence、action_logits、value、adv、reward),存入 buffer 中 具体做法是定义4个模型:Actor(action_logits)、SFT(sft_logits)、Critic(value)、RM「r(x, y)」,和kl_div、reward、优势函数adv 从prompt库中采样出来的prompt在经过SFT(微调过GPT3/GPT3.5的模型称之为SFT)做generate得到一个response,这个『prompt + response』定义为sequence(这个采样的过程是批量采样进行generate,得到一个sequence buffer),然后这个sequence buffer的内容做batched之后输入给4个模型做inference至于代码实现可以参阅此文:从零实现带RLHF的类ChatGPT:逐行解析微软DeepSpeed Chat的源码 后记1.6日决定只是想写个ChatGPT通俗导论,但为了讲清楚其中的PPO算法,更考虑到之后还会再写一篇强化学习极简入门,故中途花了大半时间去从头彻底搞懂RL,最终把网上关于RL的大部分中英文资料都翻遍之外(详见参考文献与推荐阅读),还专门买了这几本书以系统学习 第1本,《白话强化学习与pytorch》,偏通俗,对初学者友好,缺点是部分内容混乱,且对部分前沿/细节比如PPO算法阐述不足,毕竟19年出版的了第2本,《Eazy RL强化学习教程》,基于台大李宏毅等人的公开课,虽有不少小问题且其对MDP和三大表格求解法的阐述比较混乱,但其对策略梯度和PPO的阐述于初学入门而言还不错的第3本,《动手学强化学习》,张伟楠等人著,概念讲解、公式定义都很清晰,且配套代码实现,当然 如果概念讲解能更细致则会对初学者更友好第4本,《深度强化学习》,王树森等人著,偏原理讲解(无代码),此书对于已对RL有一定了解的是不错的选择第5本,《强化学习2》,权威度最高但通俗性不足,当然 也看人,没入门之前你会觉得此书晦涩,入门之后你会发现经典还是经典、不可替代,另书之外可配套七月的强化学习2带读课第6本,《深度强化学习:基于Python的理论与实践》,理论讲的挺清楚,代码实践也不错第7本,《强化学习(微课版)》,这本书是作为RL教材出版的,所以有教材的特征,即对一些关键定理会举例子展示实际计算过程,比如马尔可夫决策的计算过程,对初学者友好总之,RL里面的概念和公式很多(相比ML/DL,RL想要机器/程序具备更好的自主决策能力),而 一方面,绝大部分的资料没有站在初学者的角度去通俗易懂化、没有把概念形象具体化、没有把公式拆解举例化(如果逐一做到了这三点,何愁文章/书籍/课程不通俗)二方面,不够通俗的话,则资料一多,每个人的公式表达习惯不一样便会导致各种形态,虽说它们最终本质上都是一样的,可当初学者还没有完全入门之前,就不一定能一眼看出背后的本质了,然后就不知道该以哪个为准,从而丧失继续前进的勇气(这种情况下,要么硬着头皮继续啃 可能会走弯路,要么通过比如七月在线的课程问老师或人 提高效率少走弯路) 比如一个小小的策略梯度的计算公式会有近10来种表达,下面特意贴出其中6种,供读者辨别 第一种,本笔记和Easy RL中用的第二种,Sutton强化学习《Reinforcement Learning: An Introduction》第一版中用的 其中 第三种,David sliver在2014年的《Deterministic Policy Gradient Algorithm》论文中用的 其中, 第四种,肖志清《强化学习:原理与Python实现》中用的 第五种,Sutton强化学习在2018年的第二版中用的 其中, 第六种,Open AI spinning up教程中用的 huggingface的两篇RL教程:An Introduction to Deep Reinforcement Learning、GitHub:The Hugging Face Deep Reinforcement Learning Course TRPO原始论文:Trust Region Policy OptimizationPPO原始论文:Proximal Policy Optimization AlgorithmsPPO算法解读(英文2篇):解读1 RL — Proximal Policy Optimization (PPO) Explained、解读2 Proximal Policy Optimization (PPO)PPO算法解读(中文4篇):Easy RL上关于PPO的详解、详解近端策略优化、详解深度强化学习 PPO算法、ChatGPT第二弹:PPO算法PPO算法实现:GitHub - lvwerra/trl: Train transformer language models with reinforcement learning.如何选择深度强化学习算法?MuZero/SAC/PPO/TD3/DDPG/DQN/等如何通俗理解隐马尔可夫模型HMM?HMM学习最佳范例强化学习中“策略梯度定理”的规范表达、推导与讨论强化学习——时序差分算法KL-Divergence详解《强化学习(微课版)》,清华大学出版社出版使用蒙特卡洛计算定积分(附Python代码)David Silver 增强学习补充——重要性采样、强化学习中的重要性采样(Importance Sampling)关于Instruct GPT复现的一些细节与想法类ChatGPT逐行代码解读(2/2):从零起步实现ChatLLaMA和ColossalChat 附录:修改/完善/新增记录RL里的细节、概念、公式繁多,想完全阐述清楚是不容易的,以下是自从23年1.16日以来的修改、完善、新增记录: 1.16日,第一轮修改/完善/新增 修正几个笔误,且考虑到不排除会有比初级更初级的初学者阅读本文,补充部分公式的拆解细节1.17日,先后修正了2.2节重要性采样与重要性权重的部分不准确的描述、修正个别公式的笔误,以及补充1.4.2中关于PPO-clip的细节阐述、优化第四部分的相关描述1.18日,为措辞更准确,优化1.2.5节“基于信任区域的TRPO:通过KL散度解决两个分布相差大和步长难以确定的问题”的相关描述1.19日,为让读者理解起来更一目了然 优化1.3.1节中关于什么是近端策略优化PPO的描述 优化1.3.2节中关于“近端策略优化惩罚PPO-penalty关于自适应KL惩罚(adaptive KL penalty)”的描述 拆解细化关于 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |